package dingding

import (
	"encoding/json"
	"github.com/imroc/req"
	"log/lg"
	"time"
)

//初始化传递消息通道
var data = make(chan string, 100)

// DingDing 钉钉消息结构体
type DingDing struct {
	Msgtype string `json:"msgtype"` //钉钉消息类型
	Text    cont   `json:"text"`
	At      isAt   `json:"at"`
	Token   string //传入的订单机器人token
}

// DingDing 钉钉消息结构体
type cont struct {
	Content string `json:"content"` //通知消息
}

// DingDing 钉钉消息结构体
type isAt struct {
	IsAtAll bool `json:"isAtAll"` //@通知所有人
}

//钉钉返回值
type httpCode struct {
	Errcode int    `json:"errcode"`
	Errmsg  string `json:"errmsg"`
}

var code *httpCode
var dd *DingDing

// New 初始化结构体对象
func New(token string) {
	dd = &DingDing{
		Msgtype: "text",
		At: isAt{
			IsAtAll: true,
		},
		Token: token,
	}
	//后台运行
	go dd.run()
}

// SendMsg 发送信息
func (d *DingDing) sendMsg(msg string) {
	d.Text.Content = msg
	js, err := json.Marshal(&d)
	if err != nil {
		lg.Log.Panic("钉钉json格式解析错误", err)
	}
	//设置请求头
	header := req.Header{
		"Content-Type": "application/json",
	}

	// 只有url必选，其它参数都是可选
	r, _ := req.Post("https://oapi.dingtalk.com/robot/send?access_token="+d.Token, header, js)

	err = r.ToJSON(&code)
	if err != nil {
		lg.Log.Panic("dingding请求返回值解析json出错", err)
	}
	if code.Errmsg != "ok" {
		lg.Log.Panic("消息发送失败，请检查", code)
	}
	lg.Log.Info("钉钉报警发送成功", code)
}

//携程发送钉钉消息
func (d *DingDing) run() {
	for {
		select {
		case msg := <-data:
			//发送钉钉通知消息
			dd.sendMsg(msg)
			time.Sleep(time.Second * 5) //延迟5秒
		default:
			time.Sleep(time.Millisecond * 500)
		}
	}
}

// DDSend 暴露给外边的通道函数
func DDSend(msg string) {
	data <- msg
}
